#文件读写
#文件基本操作、文件备份、目录操作、编码及文件读写

#文件基本操作
'''
文本文件和二进制文件
二进制文件：保存的内容不是给人直接阅读的，而是提供给其他软件使用

'''
#文件的操作步骤：
#1.open:打开文件
'''
f = open('文件名','访问方式')
对象的属性：
f.closed  返回的是True,说明文件已被关闭，否则返回False
f.mode    返回被打开文件的访问模式
f.name    返回文件的名称

'''

#2.read:读文件 （会把指针移动到文件最后）
#3.write:写文件
#4.close:关闭文件
'''=========================================================='''

#1.打开文件
f = open(r'C:\Users\sea_0\Desktop\silicon\b1.py')

#2.读取文件内容
te = f.read()
print(te)

#3.关闭文件
f.close()

print('文件名',f.name)
print('访问模式',f.mode)
print('是否关闭',f.closed)
print('\n')

'''==========================================================='''
#访问模式
'''
r  以只读方式打开文件。文件的指针将会放在文件袋额开头，是默认模式。

w  打开一个文件只用于写入。如果该文件已经存在则将其覆盖。如果该文件
不存在，创建新文件。

a  打开一个文件用于追加。如果该文件已存在，文件指针将会放在文件的
结尾。新的内容将会被写入到已内容之后，如果文件不存在，创建新文件进
行写入。

'''
#访问模式举例
#读取
f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','r',encoding='UTF-8') #读取文件
str = f.read(10)    #读取前10个字节
print('读取的字符串是：',str)
f.close()

#写入
f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','w',encoding='UTF-8')#以覆盖写的方式打开
f.write('welcome to sixstaredu.com')  #覆盖写入
f.close()

f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','a',encoding='UTF-8')#以追加写的方式打开
f.write(' 哈哈哈，面相对象的学习')  #追加写入
f.close()

#读取
f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','r',encoding='UTF-8')
str = f.read()
print('覆盖、追加改写后的字符串是：',str)
f.close()
print('\n')

#由于文件读写时可能会出现IOError，一旦出错，f.close()不会被执行。
#所以，为了保证无论是否出错，都能正确关闭文件，我们可以用try ……finally
f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','r',encoding='UTF-8')
try:
    print(f.read())  #把有可能有问题的代码写在try下面
finally:             #finally无论有无报错，都会执行的代码
    f.close()
print('\n')
#上面将的默认读取的文件是文本文件，编码方式是UTF-8


'''============================================================================================'''
#二进制方式读取文件“rb”（二进制不支持中文）
f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','rb')
content = f.read()
#把二精致的内容转换成字符串（解码）
content = content.decode('utf-8')   #中文解码语句
print(content)
f.close()
print('\n')
'''============================================================================================='''

#with关键字:作用通try……finally……
#如果在调用write的过程中，出现了异常导致后续无法正常运行，从而close
#方法无法正常调用，此时资源会一直被占用。可用with来保证出现
#错误时，保证后续代码能正常运行。
#with 上下文管理器
#wiht 使用完文件后会自动将文件进行关闭，无需手动关闭。

with open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','r',encoding='UTF-8') as f: #as 取别名
     print(f.read())  #读取doctest.txt这个文件

print(f.closed)       #判断文件是否关闭
print('\n')
#================================================================================================

#tell()方法告诉我们文件的当前位置，下一次操作从当前位置开始。
#seek(offset,[,from]) 改变当前文件的指针位置
#offset开始的便宜量，from制定开始移动字节的参考位置

#打开文件
f = open(r'C:\Users\sea_0\Desktop\silicon\doctest.txt','r',encoding='UTF-8') #读取文件
text1 = f.read(10)    #读取前10个字节
print('读取的字符串是：',text1)

#查找当前位置
position = f.tell()
print('当前文件位置',position)

#把指针重新定位到文件开头
position = f.seek(0,0)   #第一个0是偏移量，第二个0是指针指向的开始位置。
text2 = f.read(10)
print('重新读取的字符串是：',text2)
f.close()



